package cn.huice;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.File;
import java.io.IOException;

public class Main {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        String filePath = "/Users/chenhaifeng/文档/工作/test.json";
        try {
            // 读取JSON文件的根节点
            JsonNode rootNode = objectMapper.readTree(new File(filePath));
            // 递归处理所有节点，删除以"c_"开头的字符串
            processNode(rootNode);
            // 将修改后的JSON写回文件
            objectMapper.writerWithDefaultPrettyPrinter()
                    .writeValue(new File(filePath), rootNode);

            System.out.println("操作完成，已删除所有以c_开头的字符串");
        } catch (IOException e) {
            System.err.println("处理JSON文件时出错：" + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 递归处理JSON中的所有节点
     */
    private static void processNode(JsonNode node) {
        if (node.isObject()) {
            // 处理对象节点：遍历所有键值对
            ObjectNode objectNode = (ObjectNode) node;
            objectNode.fieldNames().forEachRemaining(fieldName -> {
                JsonNode childNode = objectNode.get(fieldName);

                // 先递归处理子节点（处理嵌套结构）
                processNode(childNode);

                // 如果子节点是字符串且以"c_"开头，删除该键值对
                if (childNode.isTextual() && childNode.asText().startsWith("c_")) {
                    objectNode.remove(fieldName);
                }
            });
        } else if (node.isArray()) {
            // 处理数组节点：遍历所有元素
            ArrayNode arrayNode = (ArrayNode) node;
            var iterator = arrayNode.elements();
            while (iterator.hasNext()) {
                JsonNode element = iterator.next();

                // 先递归处理元素（处理数组中的嵌套对象/数组）
                processNode(element);

                // 如果元素是字符串且以"c_"开头，从数组中删除
                if (element.isTextual() && element.asText().startsWith("c_")) {
                    iterator.remove();
                }
            }
        }
        // 其他类型节点（数字、布尔等）不处理
    }
}
